package logest_substring_without_repeating_characters


//此题我们使用的是一维数组进行查重
//判断左侧的指针是否越界，如果越界直接跳出循环，有一个问题，这里为什么不使用右侧越界跳出循环？
//如果我们使用右侧越界跳出循环，如果最大无重复子字符串出现在最右侧，那么，在后面的指针一旦到最后，就会跳出循环，不会将最大的结果计入result

func LengthOfLongestSubstring (s string) int {
	var freq [256]int
	var left ,  right , result = 0 ,0 ,0
	//判断左侧指针是否越界
	for left < len(s) {
		//右侧指针不越界的情况，并且，在滑动窗口中不存在的，进行右指针后移。
		if right < len(s) && freq[s[right] - 'a'] == 0 {
			freq[s[right] - 'a'] ++
			right++
		} else {
			//如果要是存在，左指针后移，并在记录中进行清除
			freq[s[left] - 'a'] --
			left ++
		}
		
		if result < right - left {
			result = right - left
		}
	}
	return result
}